﻿// BAB_Lagrangian.h: 标准系统包含文件的包含文件
// 或项目特定的包含文件。

#pragma once
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include <ostream>
#include "k_median.h"


/*****************************************
 *
 * Args:
 * distance 的外层代表有 i 个用户，内层代表第 i 个用户与第 j 个设施之间的距离
 * k 可以替换的设施数量
 * fnum 记录的是需要选择的设施数量
 * ftype 存储的是设施编号与设施类型的对应关系: 'F' 后者 'C'
 * fac_id 所有设施的 id
 * alpha 最优解的上界
 * selected 记录哪些设施必须选中
 * unselected 记录哪些设施不能选中，与 selected 一起用于分支定界
 * max_iter 最大迭代次数
 * app_rate 近似率
 * fout 输出的文件标识符(可以是打开的文件，也可以是 cout)
 *
 *****************************************/
std::pair<bool,std::vector<int>*> Lagrangian(std::unordered_map<int, std::unordered_map<int, double>>& distance, int k, int fnum, std::unordered_map<int, char>& ftype, std::vector<int>& fac_id, double alpha, std::unordered_set<int>& selected, std::vector<int>& unselected, int max_iter, double app_rate, std::ostream& fout, wh::reference_info_list &user_info);

// TODO: 在此处引用程序需要的其他标头。
